package com.xiaojiezhu.netty.base.demo.timer;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;

import java.util.Date;

/**
 * 作者 zxj<br>
 * 时间 2017/7/14 12:05
 * 说明 时间的客户端
 *
 * 基于流的传输会有一个问题：
 * 基于流的传输比如 TCP/IP, 接收到数据是存在 socket 接收的 buffer 中。不幸的是，基于流的传输并不是一个数
 * 据包队列，而是一个字节队列。意味着，即使你发送了2个独立的数据包，操作系统也不会作为2个消息处理而仅
 * 仅是作为一连串的字节而言。因此这是不能保证你远程写入的数据就会准确地读取。举个例子，让我们假设操作
 * 系统的 TCP/TP 协议栈已经接收了3个数据包。
 *
 * 最简单的方法构建一个缓冲区，请参见 @link {@link TimerClientHandler2}
 */
public class TimerClientHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        ByteBuf buf = (ByteBuf) msg;
        try {
            long currentTimeMillis = (buf.readUnsignedInt() - 2208988800L) * 1000L;
            ctx.close(); //加载完信息后关闭连接
            System.out.println(new Date(currentTimeMillis).toLocaleString());
        } finally {
            buf.release(); //需要释放
        }
    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        super.exceptionCaught(ctx, cause);
        cause.printStackTrace();
        ctx.close();
    }
}
